/*
3.给你一个非严格递增排列的数组nums，请你原地O(1)删除重复出现的元素，使每个元素只出现一次，元素的相对顺序应该保持一致。
int * removeDuplicates(int* nums, int numsSize, int *newNumsSize) ;
*/

#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 6

int * removeDuplicates01(int* nums, int numsSize, int *newNumsSize) 
{
    int pos = 1;
    if (nums == NULL)
    {
        /* 返回空指针 */
        return NULL;
    }
    if (numsSize <= 1)
    {
        *newNumsSize = numsSize;
        return nums;
    }
    for (int idx = 1; idx < numsSize ; idx++)//避免数组越界
    {
        if (nums[idx - 1] != nums[idx])
        {
            /* 覆盖 */
            nums[pos] = nums[idx];
            pos++;
        }
    }
    *newNumsSize = pos;//更新
    return nums;
}

/* 为了原地删除出现的元素并保持相对顺序，我们可以使用双指针法，
维护两个指针，快指针用来遍历数组，满指针来指向没有存储的元素 */
// int * removeDuplicates02(int* nums, int numsSize, int *newNumsSize)
// {
//     if (nums == NULL)
//     {
//         return NULL;
//     }
//     if (numsSize <= 1)
//     {
//         *newNumsSize = numsSize;
//         return nums;
//     }
//     /* 初始化慢指针和快指针都指向数组的第一个元素 */
//     int slow = 0;
//     int fast = 1;
//     int prev = nums[0];

//     while (fast < numsSize)
//     {
//         if (nums[fast] != prev)
//         {
//             slow++;
//             /* 更新 */
//             nums[slow] = nums[fast];
//             prev = nums[fast];
//         }
//         fast++;//后移
//     }
//     *newNumsSize = slow + 1;
//     return nums;

// }

int main()
{
    int nums[BUFFER_SIZE] = {1, 3, 3, 5, 6, 6};
    int newNumsSize;

    removeDuplicates01(nums, BUFFER_SIZE, &newNumsSize);

    printf("newSize = %d\n", newNumsSize);

    for (int idx = 0; idx < newNumsSize; idx++)
    {
        printf("nums[%d] = %d\n", idx, nums[idx]);
    }

    return 0;
}